package com.ruiyun.upload.controller;
/**
 * 文件上传
 * @author fff
 *
 */

import java.util.stream.Collectors;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import com.ruiyun.upload.storage.StorageFileNotFoundException;
import com.ruiyun.upload.storage.StorageService;

@Controller
public class FileUploadController {
	
	public  final StorageService storageService;
	
	@Autowired
	public FileUploadController(StorageService storageService) {
		super();
		this.storageService = storageService;
	}
	
	@GetMapping("/")
	public String listUploafFiles(Model model) {
		
		model.addAttribute("files", storageService.loadAll().map(path -> 
			MvcUriComponentsBuilder.fromMethodName(FileUploadController.class, "serveFile", path.getFileName().toString()).build().toString()
		).collect(Collectors.toList()));
		
		return "uploadForm";
	}
	
	@GetMapping("/files/{filename:.+}")
	@ResponseBody
	public  ResponseEntity<Resource> serveFile(@PathVariable String filename) {
		Resource file = storageService.loadAsResource(filename);
		return ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=\""+file.getFilename()+"\"").body(file);
	}
	
	@PostMapping("/")
	public String handleFileUpload(@RequestParam MultipartFile file,RedirectAttributes redirectAttributes) {
		storageService.store(file);
		redirectAttributes.addFlashAttribute("message",
		        "You successfully uploaded " + file.getOriginalFilename() + "!");

		return "redirect:/";
	}
	
	 @ExceptionHandler(StorageFileNotFoundException.class)
	  public ResponseEntity<?> handleStorageFileNotFound(StorageFileNotFoundException exc) {
	    return ResponseEntity.notFound().build();
	  }
}
